package com.dingding.common.core.base.dao;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;

/**
 * 
 * @ClassName: IBaseDao
 * @Description:所有dao接口都继承自当前接口
 * @author CHEHUANBO
 * 
 */
public interface IBaseDao<T> {

	/**
	 * 
	 * @Title: getById @Description: 根据ID获取实体对象 @param id 主键ID @return T
	 *         查询到的Hibernate对象 @author CHEHUANBO @throws
	 * 
	 */
	public T getById(String id);

	/**
	 * 
	 * @Title: getById @Description: 根据ID获取实体对象 @param id 主键ID @return T
	 *         查询到的Hibernate对象 @author CHEHUANBO @throws
	 * 
	 */
	public T getById(Integer id);

	/**
	 * 
	 * @Title: saveOrUpdate @Description: 保存或更新一个Hibernate对象 @param t
	 *         待保存的对象 @return void @author CHEHUANBO @throws
	 * 
	 */
	public void saveOrUpdate(T t);

	/**
	 *
	 * @Title: save @Description:保存一个对象 @param t 待保存的对象 @author
	 *         CHEHUANBO @throws
	 * 
	 */
	public void save(T t);

	/**
	 * 
	 * @Title: update @Description: 更新 @param 待保存的对象 @return void @author
	 *         CHEHUANBO @throws
	 * 
	 */
	public void update(T t);

	/**
	 * 
	 * @Title: delete @Description: 删除一个hibernate对象 @param t 待删除的对象 @return
	 *         void @author CHEHUANBO @throws
	 * 
	 */
	public void delete(T t);

	/**
	 * 
	 * @Title: deleteRow @Description: 根据ID删除数据，并返回受影响行数 @param hql @param id
	 *         主键ID @return int 受影响行数 @author CHEHUANBO @throws
	 * 
	 */
	public int deleteRow(String hql, String id);

	/**
	 * 
	 * @Title: queryAll @Description: 查询表中所有数据对象 @return List
	 *         <T> 查询到的数据集合 @author CHEHUANBO @throws
	 * 
	 */
	public List<T> queryAll();

	/**
	 * 
	 * @Title: queryCriteriaList @Description: 根据条件查询数据 @param criterion
	 *         查询条件 @return List<T> 查询到的数据集合 @author CHEHUANBO @throws
	 * 
	 */
	public List<T> queryCriteriaList(Criterion criterion);

	/**
	 * 
	 * @Title: listHqlUnResult @Description: 根据条件查询唯一对象 @param criteria
	 *         查询条件 @return T 查询到的Hibernate实体对象 @author CHEHUANBO @throws
	 * 
	 */
	public T queryCriteriaUnResult(Criterion criterion);

	/**
	 * 
	 * @Title: listHql @Description: Hql带参查询 @param Hql 自定义Hql @param parm
	 *         参数值 @return List<T> 查询到的数据集合 @author CHEHUANBO @throws
	 * 
	 */
	public List<T> listHql(String hql, Object... parm);

	/**
	 * 
	 * @Title: listHqlByPage @Description: Hql带参分页查询 @param Hql 自定义Hql @param
	 *         currentPage 当前页 @param pageSize 每页显示记录数 @param parm 查询参数 @return
	 *         List<T> 查询到的数据集合 @author CHEHUANBO @throws
	 * 
	 */
	public List<T> listHqlByPage(String hql, int currentPage, int pageSize, Object... parm);

	/**
	 * 
	 * @Title: listSqlObj @Description: 原生sql查询，返回的是Obj数组 @param sql
	 *         自定义sql @param parm 查询参数 @return List<Object[]> 查询到的数据集合 @author
	 *         CHEHUANBO @throws
	 * 
	 */
	public List<Object[]> listSqlObj(String sql, Object... parm);

	/**
	 * 
	 * 获取查询记录数
	 * 
	 * @Title: sqlQueryGetCount 
	 * @param sql
	 * @param parm
	 * @return   记录数
	 * @author CHEHAUNBO
	 * 
	 */
	public int sqlQueryGetCount(String sql, Object... parm);

	/**
	 * 
	 * @Title: listSqlObjByPage @Description: 原生sql分页查询，返回的是Obj数组 @param sql
	 *         自定义sql @param parm 查询参数 @return List<Object[]> 查询到的数据集合 @author
	 *         CHEHUANBO @throws
	 * 
	 */
	public List<Object[]> listSqlObjByPage(String sql, int currentPage, int pageSize, Object... parm);

	/**
	 * 
	 * @Title: sqlQueryUnResultObj @Description: 原生sql查询,查询单条记录 @param sql
	 *         原生sql @param parm 查询条件 @return Object[] 查询到的单个数据 @author
	 *         CHEHUANBO @throws
	 * 
	 */
	public Object[] sqlQueryUnResultObj(String sql, Object... parm);

	/**
	 * 
	 * @Title: updateSqlRow @Description: 执行修改、添加SQL语句 @param sql 拼接SQL @param
	 *         parm 不定参 @return int 执行SQL行数 @author CHEHUANBO @throws
	 * 
	 */
	public int updateSqlRow(String sql, Object... parm);

	/**
	 * @Description:根据条件查询唯一对象
	 * @author fengshuonan
	 * @return List<T>
	 */
	public List<T> queryCriteriaListByOrder(Criterion criterion, Order order);

	/**
	 * @Title: queryCriteriaList
	 * @Description: 根据条件查询数据
	 * @param criterion
	 *            查询条件
	 * @param isCache
	 *            是否使用查询缓存 true:使用 false：不使用
	 * @return List<T>查询到的数据集合
	 */
	public List<T> queryCriteriaListByOrderDesc(Criterion criterion, String orderString, boolean isCache);

	/**
	 * 
	 * @Title: listSqlObj @Description: 原生sql查询 @param sql @param currentPage
	 *         当前页 @param pageSize 每页显示记录数 @param parm @return List
	 *         <Object[]> @throws
	 */
	public List<Object[]> sqlQueryListObj(String sql, boolean isCache, Object... parm);

	/**
	 * @Title: listHqlFreeObject 
	 * @Description: Sql带参查询 
	 * @param Sql 自定义Sql 
	 * @param parm 参数值
	 * @return List<T> 查询到的数据集合 
	 * @author fengshuonan 
	 */
	public List<?> listSqlFreeObject(String Sql, Class<?> clazz, Object... parm);

	/**
	 * 
	 * @Description:执行sql并把结果转化成自定义的bean
	 * @param sql 执行的sql语句
	 * @param beanClass 接受结果bean的class
	 * @author CHEHUANBO
	 * @since 2.4.0
	 * 
	 */
	public List<?> listSqlToCustomBean(String sql, Class<?> beanClass, Object... params);

	/**
	 * @Description: 获取查询条件
	 * @author fengshuonan
	 * @since 2.3.2
	 */
	public Criteria getCriteria();

	/**
	 * @Description:执行sql并把结果转化成自定义的bean
	 * @param beanClass 接受结果bean的class
	 * @param fieldList beanClass中需要做特殊处理的字段
	 * @author fengshuonan
	 * @since 2.4
	 */
	public List<?> listSqlToCustomBean(String sql, int offset, int pageSize, Class<?> beanClass, List<String> fieldList,
			Object... params);
}
